Programando o Framework do Direct3D 7 IM 
Por Wolfgang Engel 

Um Exemplo Bsico:

Aplicando uma textura no fundo

Prefcio
Com o advento das duas interfaces novas do DirectX 7, foram adicionadas como parte do Direct3D: IDirect3D7 e IDirect3Ddevice7. Estes objetos fornecem vrias caractersticas sobre seus parceiros das verses anteriores do Direct3D. Para mencionar algumas: transformao de hardware acelerada e iluminao, mapeamento do meio ambiente com mapas ambientais cbicos, geometria combinada, dispositivo do estado dos blocos, o gerenciador de textura pode manusear as prioridades de textura, etc. 

Esta srie de tutoriais enfatiza o uso das novas caractersticas do Direct3D com o framework (um esqueleto bsico para criao de aplicativos em Direct3D IM) do Direct3D IM fornecido pela Microsoft. Desde a sua chegada no DirectX 6, o framework do Direct3D IM modificou-se dramaticamente. Est mais fcil de ser usado e codificado...O que  um trabalho timo.

H tambm uma nova Biblioteca Utilitria: Direct3DX, que est no topo do Direct3D IM (Tutorial:http://www.icon.fi/~solar/dxtut.html). Ela fornece funcionalidade de ajuda para inumerveis dispositivos de configuraes, instalao de um dispositivo, funcionamento em tela cheia ou mdulos de janelas com uniformidade, funcionando com operaes reestruturadas, vetor de clculos e operaes na matriz e carregamento de arquivo de simplificao de imagem e criao de textura. Alm de fornecer funes para desenho de formas simples, sprites e mapas cbicos. Contudo, Direct3DX no fornece uma hierarquia de cena ou suporta arquivos X. Desta maneira a completa complexidade do Direct3D IM est enclausurada. H um grande inconveniente...Ns no recebemos o cdigo fonte desta biblioteca. Recomendo criar a sua prpria biblioteca. Existem muitas fontes abertas de bibliotecas de onde aprender.

Um bom lugar para comear a explorar  o Direct3D que est dentro do Kit de Desenvolvimento de Software do DirectX (SDK). Todas as amostras de D3D usam o Framework do Direct3D IM. Este framework comum lhe d uma base comum na qual voc pode implementar as suas caractersticas individuais. Como iniciante, voc evita muitos erros bsicos. O cdigo do framework  rpido e muito bem testado. Voc pode concentrar sua energia em aprender. Como sou programador intermedirio ou profissional, voc tem uma boa plataforma de testes. Talvez um programador profissional escreveria seu prprio framework, que combina melhor com as necessidades dele, ao olhar na Fonte Framework do D IM Framework Source:

Por exemplo ATI tem uma verso levemente modificada deste framework . NVIDIA construiu um framework completamente novo.

A ajuda do SDK HTML  a fonte primria para o entendimento do DirectX em geral e do D3D especificamente. Voc pode ach-lo online em MSDN library. Exemplo de cdigo  o prximo melhor veculo para aprender Direct3D. Os exemplos de cdigos do Mdulo Imediato do Direct3D esto em \mssdk\samples\multimedia\d3dim. Abaixo \d3dim are \bin, \include, \lib, \media, e \src. Todos os exemplos prontos para serem compilados podem ser encontrados em \src, dependem de \include e \lib, e usam o contedo de arte em \media. O instalador SDK coloca os executveis compilados em \bin. Brinque com os exemplos no diretrio bin. A Microsoft fornece um frum de discusso em http://discuss.microsoft.com/archives/DIRECTXDEV.html e um FAW para os desenvolvedores dividirem informaes. Eles fornecem um excelente artigo no incio do framework em http://msdn.microsoft.com/voices/directx05152000.asp. Consiga o cdigo fonte deste artigo clicando aqui.

Compilando o Cdigo
Em nosso primeiro exemplo, daremos uma olhada na funcionalidade bsica fornecida pelo framework e em um dos programas mais simplificados que eu posso pensar em usar. Veremos uma textura colocada no fundo da janela e um timer, que mostra os quadros por segundo...Este pequeno programa trabalhar em janelas e tela cheia. Pressione Alt-F4 para alternar entre estes mdulos. F1 mostrar uma caixa de dilogo sobre este aplicativo. F2 lhe dar uma seleo de drivers utilizveis e ESC fechar o aplicativo.

Primeiro, vamos conversar sobre os arquivos que voc precisa para compilar o programa. O melhor lugar para copiar os arquivos  no diretrio de cdigos do Direct3D Mdulo Imediato do diretrio do DirectX 7 SDK, que tem de estar instalado. No meu computador isso seria para tex1: D:\mssdk\samples\Multimedia\D3DIM\src\tex7_1.

H somente quatro arquivos de programa:

tex1.cpp: o arquivo principal 
winmain.rc: o arquivo fonte (menu, acelerador, informao de cones etc.) 
resource.h: cabealho do winmain.rc 
directx.ico: o cone que voc pode ver se o programa est minimizado ou se maximizado no canto esquerdo do ttulo da janela. 
Se voc quiser compilar tudo, tem que linkar o applicativo com os seguintes arquivos *.lib : ddraw.lib dxguid.lib ..\..\lib\d3dframe.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib winmm.lib 

d3dframe.lib  a biblioteca esttica que abriga o framework do Direct3D 7 . Voc pode encontrar a fonte de framework no diretrio D3Dframe em:
D:\mssdk\samples\Multimedia\D3DIM\src\D3DFrame. Andaremos agora atravs de uma viso de nvel alto do Framework para entender e usar o Framework do Direct3D 7. Ele consiste de sete arquivos *.cpp . Estes arquivos possuem as qualidades de funcionalidade bsicas que voc necessita para iniciar a programao de um jogo em Direct3D.

d3dapp.cpp expe a interface de aplicao usada para os exemplos. 
d3dframe.cpp informa que a interface de aplicao do framework (em tex1.cpp) usa "under the covers"(sob as coberturas) 
d3denum.cpp contm suporte de enumerao para drivers, dispositivos e mdulos. 
d3dtextr.cpp fornece suporte de textura. 
d3dfile.cpp suporte de arquivos-X. 
d3dmath.cpp entrega as funes de utilidade matemtica. 
d3dutil.cpp  um pega tudo para qualquer funo remanescente de miscelnea til.
O mdulo d3dApp.cpp contm a classe CD3DApplication. Esta classe publica a interface para os programas de amostra, no arquivo D3Dapp.h. Ele fornece sete funes:

virtual HRESULT OneTimeSceneInit() { return S_OK; }
virtual HRESULT InitDeviceObjects() { return S_OK; }
virtual HRESULT DeleteDeviceObjects() { return S_OK; }
virtual HRESULT Render() { return S_OK; }
virtual HRESULT FrameMove( FLOAT ) { return S_OK; }
virtual HRESULT RestoreSurfaces() { return S_OK; }
virtual HRESULT FinalCleanup() { return S_OK; }

Estas so as funes que usaremos no tex1.cpp para criar nosso D3D app. Elas poderiam ser chamadas de "interface pblica" para o Framework do Direct3D IM Framework. Agora vamos entrar na fonte.

A Classe Apllication
A classe Apllication em tex1.cpp:

class CMyD3DApplication : public CD3DApplication
{
D3DTLVERTEX m_Background[4]; // Vrtices usados para representar o fundo
FLOAT m_fStartTimeKey; // Referncia de tempo para os clculos
static HRESULT ConfirmDevice( DDCAPS* pddDriverCaps, 
D3DDEVICEDESC7* pd3dDeviceDesc );
protected:
HRESULT OneTimeSceneInit();
HRESULT InitDeviceObjects();
HRESULT DeleteDeviceObjects();
HRESULT Render();
HRESULT FrameMove( FLOAT fTimeKey );
HRESULT FinalCleanup();

public:
CMyD3DApplication();
};

As primeiras duas variveis englobam os vrtices para apresentar o fundo e a referncia para calcular o tempo. O mtodo ConfirmDevice() confere o dispositivo para um conjunto mnimo de capacidades.

Se voc gostar de usar somente dispositivos que realmente apoiam as texturas mltiplas, pode usar os seguintes cdigos neste mtodo: if( pd3dDeviceDesc->wMaxTextureBlendStages > 1 )
if( pd3dDeviceDesc->wMaxSimultaneousTextures > 1 )
if( pd3dDeviceDesc->dwTextureOpCaps & D3DTEXOPCAPS_MODULATE ) 
return S_OK; 

Para a inicializao permanente a funo OneTimeSceneInit()  chamada uma vez por ciclo de execuo da aplicao. Voc pode carregar texturas e arquivos-x, posicionar valores calculados, etc. Basicamente qualquer alocao de fonte de um tempo deve ser realizada aqui. O InitDeviceObjects()  usado para inicializar objetos por dispositivo tais como carregar bits de textura em um dispositivo de superfcie, posicionar matrizes e popularizar buffers de vrtices. O mtodo DeleteDeviceObjects()  chamado quando o app existe, ou quando o dispositivo estiver sendo modificado. Ele apaga quaisquer objetos dependentes de dispositivo, que so inicializados em InitDeviceObjects(). 

Estas duas funes so pares relacionados; tenha certeza que as alocaes de fonte de dispositivo especfico esto relacionadas com as supresses ou voc estar perdendo memria a cada vez que uma mudana de dispositivo acontecer..

O mtodo Render()  auto-explicativo. Ele  chamado uma vez por quadro e  o ponto de entrada para a apresentao 3d.. Ele poderia posicionar o estado de apresentao, clarear o ponto de vista e apresentar a cena. Em um programa animado, o mtodo FrameMove()  usado para englobar o cdigo de animao completo tais como matrizes de atualizao, coordenadas das texturas, coordenadas dos objetos e outras atividades de tempo variado. Este exemplo no usa qualquer animao... Apenas uma textura que  jogada no fundo. Assim, ela no  usada de verdade. Bem.... FinalCleanup() como ltimo mtodo protegido destri, por exemplo: a memria alocada para as texturas, apaga os objetos de arquivo, etc.  a parte contadora para OneTimeSceneInit() e destri quaisquer objetos por aplicao. Tome cuidado com perda na memria. 

OneTimeSceneInit
O primeiro mtodo que  exportado para o framework  OneTimeSceneInit():

HRESULT CMyD3DApplication::OneTimeSceneInit()
{
// Inicializa as vrtices usadas para a apresentao do fundo
D3DVECTOR vFar = D3DVECTOR( 0.0f, 0.0f, 0.5f );
m_Background[0] = D3DTLVERTEX( vFar, 0.5f, 0xffffffff, 0, 0.0f, 1.0f );
m_Background[1] = D3DTLVERTEX( vFar, 0.5f, 0xffffffff, 0, 0.0f, 0.0f );
m_Background[2] = D3DTLVERTEX( vFar, 0.5f, 0xffffffff, 0, 1.0f, 1.0f );
m_Background[3] = D3DTLVERTEX( vFar, 0.5f, 0xffffffff, 0, 1.0f, 0.0f );

// Carrega as texturas
D3DTextr_CreateTextureFromFile( "lake.bmp" );

return S_OK;
}

O fundo englobou quatro vrtices. O "TL" indica que estas so as vrtices para a sua aplicao - no o Direct3D - que deveria iluminar e transformar. Estas vrtices omitem o canal de informao da transformao e iluminao juntos e passam direto para o rasterizer (rastreador).

No faria nenhum sentido transformar ou iluminar os vrtices que englobam a textura do fundo. 

Os construtores D3D_OVERLOADS definidos na coluna 11 oferecem uma maneira conveniente para os programadores C++ criarem vrtices transformados e iluminados com D3DTLVERTEX.

_D3DTLVERTEX(const D3DVECTOR& v, float _rhw, D3DCOLOR _color,
D3DCOLOR _specular, float _tu, float _tv)
{
sx = v.x;
sy = v.y;
sz = v.z;
rhw = _rhw;
color = _color;
specular = _specular;
tu = _tu;
tv = _tv;
}
O sistema exige uma posio de vrtice que j foi transformada. Assim, os valores x e y devem estar nas coordenadas da tela e z deve ser um valor de profundidade do pixel, que poderia ser usado em um z-buffer (no usaremos um z-buffer aqui). Os valores Z podem variar de 0.0 at 1.0, onde 0.0  a posio mais prxima do espectador, e 1.0  a posio mais distante ainda visvel dentro da rea de viso. Imediatamente seguindo a posio, vrtices transformados e iluminados devem incluir um valor RHW (recproco do homogneo W).

Antes de rastrear (rasterizing) as vrtices, elas tm de ser convertidas de vrtices homogneas para no homogneas, porque o rastreador as espera desta maneira. O Direct3D converte as vrtices homogneas em no homogneas dividindo as coordenadas x-, y-, e z- pela coordenada w-, e produz um valor RHW ao inverter a coordenada w-. Isto  somente feito para vrtices que so iluminados e transformados pelo Direct3D.
O valor RHW  usado de mltiplas maneiras: para calcular a neblina, para realizar mapeamento de textura de perspectiva correta e para w-buffering (uma forma alternativa de buffering de profundidade). 

Com os D3D_OVERLOADS definidos, o D3DVECTOR  declarado como:

_D3DVECTOR(D3DVALUE _x, D3DVALUE _y, D3DVALUE _z);


D3DVALUE  o tipo de dado fundamental do Direct3D fracional.  declarado em d3dtypes.h como

typedef float D3DVALUE, *LPD3DVALUE;


A fonte mostra que os valores x e y para D3DVECTOR so sempre 0.0f (isto ser modificado em InitDeviceObjects()). rhw  sempre 0.5f, cor  0xfffffff e specular est posicionado em 0. Somente os valores tu1 e tv1 so diferenciados entre as quatro vrtices. Estas so as coordenadas da textura de fundo.

A fim de mapear os texels em cima dos primitivos o Direct3D exige uma variao de endereo uniforme para todos os texels em todas as texturas. Entretanto, ele usa um esquema de endereamento genrico no qual todos os endereos texel esto em uma variao de 0.0 at 1.0, inclusive.
Se, ao contrrio, voc decidir determinar as coordenadas da textura para fazer o Direct3D usar a metade do fundo da textura, as coordenadas da textura na sua aplicao determinariam para os vrtices do primitivo neste exemplo que so (0.0,0.0), (1.0,0.0), (1.0,0.5), e (0.0,0.5). O Direct3D aplicar a metade do fundo da textura como um background.
Nota: Ao determinar as coordenadas da textura fora daquela variao, voc pode criar efeitos especiais de texturizao. 

Voc encontrar a declarao do D3DTextr_CreateTextureFromFile() dentro do cdigo fonte do Framework em d3dtextr.cpp. Ele cria uma bitmat local de um arquivo passado. As texturas poderiam ser criadas dos arquivos *.bmp e *.tga . As texturas poderiam ser gerenciadas no framework em uma lista correlacionada que engloba a info por textura, chamado de container de textura.

struct TextureContainer
{
TextureContainer* m_pNext; // ptr Lista correlacionada 

TCHAR m_strName[80]; // Nome da textura (duplica como um nome de arquivo de imagens)
DWORD m_dwWidth;
DWORD m_dwHeight;
DWORD m_dwStage; // Estgio da textura (para dispositivos multi textura)
DWORD m_dwBPP;
DWORD m_dwFlags;
BOOL m_bHasAlpha;

LPDIRECTDRAWSURFACE7 m_pddsSurface; // Superfcie da textura
HBITMAP m_hbmBitmap; // Bitmap contendo a imagem da textura
DWORD* m_pRGBAData;

public:
HRESULT LoadImageData();
HRESULT LoadBitmapFile( TCHAR* strPathname );
HRESULT LoadTargaFile( TCHAR* strPathname );
HRESULT Restore( LPDIRECT3DDEVICE7 pd3dDevice );
HRESULT CopyBitmapToSurface();
HRESULT CopyRGBADataToSurface();

TextureContainer( TCHAR* strName, DWORD dwStage, DWORD dwFlags );
~TextureContainer();
};
InitDeviceObjects
Qualquer textura tem de ser rearmazenada antes de ser usada. Isto  feito dentro do InitDeviceObjects() por uma chamada para o to D3DTextr_RestoreAllTextures():

HRESULT
CMyD3DApplication::InitDeviceObjects()
{ D3DTextr_RestoreAllTextures( m_pd3dDevice

); // Posiciona as dimenses para a magem do
fundo D3DVIEWPORT7
vp;m_pd3dDevice->GetViewport(&vp);
m_Background[0].sy = (FLOAT)vp.dwHeight;
m_Background[2].sy = (FLOAT)vp.dwHeight;
m_Background[2].sx = (FLOAT)vp.dwWidth;
m_Background[3].sx = (FLOAT)vp.dwWidth;

return S_OK;
}

O mtodo D3DTextr_RestoreAllTextures() chama ao menos o mtodo TextureContainer::Restore() que confere, por exemplo, o device caps, posiciona uma nova superfcie para a textura com o device caps e ajusta o tamanho da textura para ser de potncia de 2 (d uma olhada neste mtodo em d3dtextr.cpp).

Ele liga o gerenciamento de textura para os dispositivos de hardware, limita o tamanho da textura se o driver no pode manusear texturas grandes ( por exemplo as placas 3D Voodoo 2 e 3 no podem manusear texturas maiores que 256x256). H tambm uma rotina que faz a textura quadrada, se o driver o exige. Uma outra rotina enumera os formatos da textura e encontra o formato mais prximo, que  apoiado pelo dispositivo etc.

O mtodo IDirect3DDevice7::GetViewport() recupera os parmetros da rea de viso atualmente posicionados para o dispositivo na estrutura de um D3DVIEWPORT7. dwWidth e dwHeight so as dimenses da rea de viso na superfcie alvo de apresentao, em pixels. A menos que voc esteja somente apresentando-se para um sub-posicionamento da superfcie, estes membros deveriam ser posicionados para a dimenso da superfcie alvo de apresentao.

FrameMove()
O prximo mtodo de framwork chamado  FrameMove():

HRESULT CMyD3DApplication::FrameMove( FLOAT fTimeKey )
{
return S_OK;
}



Porque ns no estamos animando uma cena, no h nada a ser codificado dentro destes mtodos.

Render()
Agora um dos mtodos chaves que  chamado: 




HRESULT CMyD3DApplication::Render() {
// Inicia acena if( SUCCEEDED(
m_pd3dDevice->BeginScene()
) ) { //
Desenhao fundo m_pd3dDevice->SetTexture( 0,
D3DTextr_GetSurface("lake.bmp")); m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,
D3DFVF_TLVERTEX, m_Background, 4, 0

); // Finaliza a
cenam_pd3dDevice->EndScene();
}

return S_OK;
}

Esta funo  chamada em par BeginScene()/EndScene(). A primeira funo  chamada antes de "renderizar" a cena, e a segunda depois disto. O BeginScene faz ao sistema conferir suas estruturas de dados interna, a disponibilidade e validade das superfcies de apresentao e marca um sinal internamente para saber que uma cena est em progresso. A tentativa de chamar o mtodo de "rendelizao" quando uma cena no estiver em progresso, falha, retornando D3DERR_SCENE_NOT_IN_SCENE. Uma vez que a sua "renderizao" estiver completa, voc precisa chamar EndScene(). Ele limpa a marca interna que indica que uma cena est em progresso, descarrega os dados escondidos e assegura que as superfcies de apresentao esto OK.

Se voc gostar de usar as funes GDI, tenha certeza que todas as chamadas GDI so feitas fora das funes de cena.

O mtodo IDirect3DDevice7::SetTexture() determina uma textura para um dado estgio para um dispositivo. O primeiro parmetro deve ser usado um nmero em uma variao de 0-7 inclusive. Passe o ponteiro da interface da textura como sendo o segundo parmetro. Este mtodo incrementa a contada referncia da superfcie da textura sendo determinada. Quando a textura no  mais necessria, voc deve posicionar a textura em um estgio apropriado para NULL. Se voc falhar ao fazer isto, a superfcie no ser liberada, resultando em uma perda de memria. Desde a verso6, o Direct3D mantm uma lista acima de oito texturas atuais. Assim o Direct3D apia a mistura de at oito texturas em cima de uma primitiva de uma vez. Ele mistura estas texturas em cima de todas as primitivas que apresenta. Somente texturas criadas com ponteiros de interface de textura podem ser usados no posicionamento das texturas atuais.

Nota: As texturas abaixo da interface do IDirect3D2 foram manipuladas usando manuseadores de textura. Com a interface do IDirect3D7 (e o legado da interface do IDirect3D3 ), voc cria e usa texturas atravs dos ponteiros da interface at as superfcies da textura. Voc obtm um ponteiro de interface de textura quando voc cria a superfcie de textura ao chamar o IDirectDraw7::CreateSurface() que  chamado dentro do framework pelo mtodo D3Dtextr_CreateTextureFromFile() .

Quando a sua aplicao seleciona uma textura como a atual textura, ele instrui o dispositivo e Direct3D para aplicar a textura em todas as primitivas que so apresentadas daquela hora at a atual textura for modificada novamente. Se cada primitiva em uma cena 3-D tiver sua prpria textura, ela deve ser posicionada antes de cada primitiva ser apresentada.

Dispositivos de Software no suportam a determinao de uma textura mais que um estgio de textura de cada vez.

O mtodo IDirect3DDevice7:rawPrimitive() apresenta a lista de vrtices especificados como uma seqncia de primitivas geomtricas do tipo especificado: 

HRESULT DrawPrimitive (
D3DPRIMITIVETYPE dptPrimitiveType,
DWORD dwVertexTypeDesc,
LPVOID lpvVertices,
DWORD dwVertexCount,
DWORD dwFlags
);

O primeiro parmetro  dptPrimitiveType. Estes so os tipos de primitivas que podem ser apresentadas por este comando:


typedef enum _D3DPRIMITIVETYPE {
D3DPT_POINTLIST = 1,
D3DPT_LINELIST = 2,
D3DPT_LINESTRIP = 3,
D3DPT_TRIANGLELIST = 4,
D3DPT_TRIANGLESTRIP = 5,
D3DPT_TRIANGLEFAN = 6,
D3DPT_FORCE_DWORD = 0x7fffffff,
} D3DPRIMITIVETYPE;

Voc pode ver as diferentes primitivas como figuras dentro do DirectX SDK. O segundo parmetro do DrawPrimitive(), D3DFVF_TLVERTEX, descreve o formato da vrtice usada para este conjunto de primitivas. O arquivo principal d3dtypes.h declara estas "flags" para descrever explicitamente um formato da vrtice que fornece um auxiliador de macros que age como combinaes comuns de tais "flags". Cada um dos mtodos de apresentao do IDirect3Ddevice7 aceita uma combinao destas "flags" e as usa para determinar como apresentar as primitivas. Basicamente, estas "flags" falam do sistema, quais componentes das vrtices - posio, normal, cores e o nmero das coordenadas das texturas - sua aplicao usa e, indiretamente, quais partes do canal de "renderizao" que voc queira que o Direct3D as aplique. Alm do mais, a presena ou ausncia de uma "flag" formato de vrtice comunica que os campos do componente da vrtice esto presentes na memria, e que voc omitiu. Ao usar somente os componentes de vrtice necessrios, a sua aplicao pode conservar memria e minimizar o processamento de bandwidth (banda larga) exigido para apresentar os modelos. O arquivo principal d3dtypes.h define a seguinte ajuda de macro que voc pode usar para descrever o formato do vrtice declarado pela estrutura do D3DTLVERTEX :

#define D3DFVF_TLVERTEX ( D3DFVF_XYZRHW | \
D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1 )

D3DFVF_XYZRHW fala ao seu sistema que a sua aplicao est usando vrtices transformadas e iluminadas. Entretanto, o Direct3D no transforma as suas vrtices com o mundo, viso, ou matrizes de projeo, nem faz que ele realize quaisquer clculos de iluminao. Ele as passam diretamente ao driver para serem rasterizadas. O D3DFVF_DIFFUSE indica que o formato Vertex inclui o componente de difuso de cor. O D3DFVF_SPECULAR indica que o formato vrtice inclui um componente de cor specular. O D3DFVF_TEX1 nos mostra o nmero de conjuntos de texturas coordenadas para esta vrtice.

// A descrio do formato vrtice para esta vrtice seria: (D3DFVF_XYZRHW | 
// D3DFVF_DIFFUSE |D3DFVF_SPECULAR |D3DFVF_TEX1)
typedef struct _D3DTLVERTEX {
D3DVALUE sx, sy, sz; /* Cordenadas da tela */
D3DVALUE rhw; /* reciproco do homogneo W */
D3DCOLOR color; /* cor da vertice */
D3DCOLOR specular; /* componente Specular da vertice*/
float tu1,tv1; // coordenadas da estrutura
} D3DTLVERTEX, *LPD3DTLVERTEX;

Descrevi uma verso super carregada dentro da seo acima do OneTimeSceneInit().

Anterior as aplicaes do DirectX 6.0, eram exigidas serem usadas uma das trs tipos de vrtices - D3DVERTEX, D3DLVERTEX, e D3DTLVERTEX - dependendo de quais partes do canal geomtrico do Direct3D estivesse sendo usado. Com a introduo de formatos de vrtices mais flexveis no DirectX 6.0, voc pode declarar as vrtices em muito mais maneiras que antes, mas voc pode ainda utilizar as estruturas pr definidas para descrever as vrtices no transformados e no iluminados, as vrtices no transformados mas iluminados e as vrtices que foram ambos transformados e iluminados.
Com o novo formato de vrtice flexvel, os vrtices podem conter as informaes ambas de cor e normais. Pela ausncia, o Direct3D usa esta informao quando calcula a iluminao.

O terceiro parmetro do DrawPrimitive()  um ponteiro para a apresentao das vrtices a serem usadas na seqncia primitiva. Depois que o nmero de vrtices na apresentao for fornecido.

As primitivas indexadas ou no: h duas maneiras de agrupar as vrtices que definem um primitivo: usando no indexados e usando indexados. Para criar um primitivo no indexado, voc preenche uma apresentao com uma lista ordenada de vrtices. Ordenada significa que a ordem dos vrtices na apresentao indica como construir os tringulos. O primeiro tringulo consiste dos trs primeiras vrtices, o segundo tringulo consiste das trs vrtices seguintes e assim por diante. Se voc tiver dois tringulos que estejam conectados, voc ter que especificar as mesmas vrtices mltiplas vezes. Para criar um primitivo indexado, voc preencher uma apresentao com uma lista no ordenada de vrtices e especificar a ordem com uma Segunda apresentao (apresentao de ndex). Isto significa que as vrtices podem ser divididas por tringulos mltiplos, simplesmente por ter mltiplas entradas na apresentao de ndex que se referem  mesma vrtice. A maioria dos modelos 3D dividem um nmero de vrtices. Entretanto, voc pode salvar bandwith (banda larga) e tempo do CPU dividindo estas vrtices entre os mltiplos tringulos. Primitivos indexados so chamados de f.e. por 

// Mostra o
objetom_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, D3DFVF_VERTEX,
m_pCubeVertices, NUM_CUBE_VERTICES, 
m_pCubeIndices, NUM_CUBE_INDICES, 0 );

O nmero mximo de vrtices permitido  D3DMAXNUMVERTICES (0xFFFF). O ltimo parmetro  uma "flag" que tem de ser zero na apresentao do primitivo sem aguardar, ou D3DDP_WAIT, que causa o mtodo ter que esperar at que os polgonos tenham sido apresentados antes que ele retorne, ao invs de retornar to logo que os polgonos foram enviados para a placa de vdeo (O mtodo retorna to logo a placa de vdeo responda). Esta "flag"  usada tipicamente para depurao. As aplicaes no devem tentar usar esta "flag" para assegurar que uma cena tenha sido atualizada antes de continuar.

DeleteDeviceObjects()
Quando a app estiver finalizada, o DeleteDeviceObjects()  chamado:

HRESULT CMyD3DApplication:eleteDeviceObjects()
{
D3DTextr_InvalidateAllTextures();

return S_OK;
}

A chamada para o D3DTextr_InvalidateAllTextures() libera as superfcies alocadas para as texturas.

FinalCleanup()
O framework envia sua ltima chamada para o FinalCleanup().

HRESULT CMyD3DApplication::FinalCleanup()
{
D3DTextr_DestroyTexture( "lake.bmp" );

return S_OK;
}

O D3DTextr_DestroyTexture() libera a memria alocada para o container de texturas.

Final
Espero que voc tenha gostado da nossa pequena viagem dentro do mundo do Framework do Direct3D 7 IM .Este foi um exemplo simples de como mostrar o novo Framework do Direct3D 7. O prximo passo  um exemplo mais complexo... 

Se voc no gostou ou gostou, d sua opinio pelo endereo wolf@direct3d.net

